package api;

import java.util.Arrays;

/**手写SimpleArrayList,为什么要手写呢?
 * 第一是理解原理(先从知其然,再知其所以然)
 * 第二是拓展思路(当官方提供的集合不能满足需求时,我们就要进行扩展)
 * 第三是简历编写(第一个维度扎实Java基础,第二个维度是基于Java基本语法及面向对象手写ArrayList)
 * */
public class SimpleArrayList {//模仿ArrayList
    /**存储数据*/
    private Object[] data;
    /**用于记录有效元素的个数*/
    private int size;
    public SimpleArrayList(){
        this(16);
    }
    public SimpleArrayList(int cap){
        data=new Object[cap];
    }
    //向size位置添加新的元素
    public void add(Object element){
        //1.判断容器是否满了,满了则扩容,并拷贝元素
        if(size == data.length){
            //1.1扩容并复制元素
            //Object[] newArray=new Object[data.length*2];
            //System.arraycopy(data,0,newArray,0,size);
            //1.2将新数组的地址赋值给data变量
            //data=newArray;//让原有数组指向新的数组
            data= Arrays.copyOf(data,2*data.length);
        }
        //2.存储元素
        data[size]=element;
        //3.有效元素个数加1
        size++;
    }
    /**删除指定元素*/
    public boolean remove(Object obj){
        //1.判断集合是否为空
        if(size==0)return false;
        //2.遍历集合找元素
        boolean flag=false;//定义一个标识,用于标识是否找到了元素
        for(int i=0;i<size;i++){
           if(data[i].equals(obj)){
               System.arraycopy(data,i+1,data,i,size-i-1);
               flag=true;//表示找到并移除了
               break;
           }
        }
        if(!flag)return false;//没找到返回false
        //3.将size-1位置元素设置为null
        data[size-1]=null;
        //4.有效元素个数减一
        size--;
        return true;
    }

    public int size(){
        return size;
    }
    @Override
    public String toString() {
        //考虑使用上StringBuilder对象,输出格式[100,200]
        StringBuilder sb=new StringBuilder("[");
        for(int i=0;i<size;i++){
            sb.append(data[i]).append(",");
        }
        sb.deleteCharAt(sb.lastIndexOf(","));
        sb.append("]");
        return sb.toString();
    }
    public static void main(String[] args) {
        SimpleArrayList list=new SimpleArrayList();
        list.add(100);
        list.add(200);
        list.add(300);
        System.out.println(list);
    }
}
